// 接口类型定义
interface Person {
  name: string;
  age?: number;
}

const Jack: Person = {
  name: 'Jack',
  age: 18
}

const Tom: Person = {
  name: 'Tom',
  age: 18
}

interface Person2 {
  readonly name: string; // 只读属性
  age: number;
  [propName: string]: string | number; // 定义任意类型，这个类型一定要包括所有的父类型。这里不能只写string，会报错
}

// 函数定义
interface Sum {
  (x: number, y: number): number;
}

type Sum2 = (x: number, y: number) => number;

const sum: Sum = (a, b) => a + b;
const sum2: Sum2 = (a, b) => a + b;

// 接口继承
/*
* 接口可以重复定义 会进行合并。type不可以
* 接口可以继承，type不能继承，但可以使用联合类型和交叉类型来模拟继承
*/
interface User {
  name: string;
  id: string;
}

// 重复定义 会进行合并
interface User {
  age: number;
}
interface Admin extends User {
  role: number;
}

const user: Admin = {
  name: 'Tom',
  id: '2',
  role: 1,
  age: 18
}

type Admin2 = User & {
  role: number;
}
// 不能重复定义
// type Admin2 = {
//   name: string;
// }

const user2: Admin2 = {
  name: 'Tom',
  id: '2',
  role: 1,
  age: 18
}
